#ifndef SERIALMANAGER_H
#define SERIALMANAGER_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTimer>
#include "models/serialconfig.h"

/**
 * @brief 串口管理类（业务层）
 * 
 * 职责：
 * 1. 管理串口的打开、关闭、配置
 * 2. 处理数据的收发
 * 3. 数据格式转换（HEX/ASCII）
 * 4. 自动发送定时管理
 * 5. 统计信息管理
 * 
 * 特点：
 * - 独立于UI，可以被任何界面使用
 * - 通过信号槽与UI通信
 * - 可以单独测试
 */
class SerialManager : public QObject
{
    Q_OBJECT

public:
    explicit SerialManager(QObject *parent = nullptr);
    ~SerialManager();

    // 串口操作
    bool openPort(const SerialConfig &config);
    void closePort();
    bool isOpen() const;
    
    // 扫描可用串口
    QList<QSerialPortInfo> getAvailablePorts() const;
    
    // 数据发送
    qint64 sendData(const QByteArray &data);
    qint64 sendText(const QString &text, bool addNewline = false);
    qint64 sendHex(const QString &hexString);
    
    // 自动发送
    void startAutoSend(const QByteArray &data, int interval);
    void stopAutoSend();
    bool isAutoSending() const;
    
    // 统计信息
    quint64 getRxCount() const { return m_rxCount; }
    quint64 getTxCount() const { return m_txCount; }
    void clearStatistics();
    
    // 工具方法
    static QByteArray byteArrayToHex(const QByteArray &data);
    static QByteArray hexToByteArray(const QString &hexString, bool *ok = nullptr);
    
    // 获取当前配置
    SerialConfig getConfig() const { return m_config; }
    QString getErrorString() const;

signals:
    // 数据接收信号
    void dataReceived(const QByteArray &data);
    
    // 状态变化信号
    void portOpened();
    void portClosed();
    void errorOccurred(const QString &error);
    
    // 统计信息更新信号
    void statisticsUpdated(quint64 rxCount, quint64 txCount);

private slots:
    void onReadyRead();
    void onAutoSendTimeout();
    void onErrorOccurred(QSerialPort::SerialPortError error);

private:
    QSerialPort *m_serialPort;      // 串口对象
    SerialConfig m_config;          // 当前配置
    
    // 统计
    quint64 m_rxCount;              // 接收字节数
    quint64 m_txCount;              // 发送字节数
    
    // 自动发送
    QTimer *m_autoSendTimer;        // 自动发送定时器
    QByteArray m_autoSendData;      // 自动发送的数据
    
    // 错误处理
    QSerialPort::SerialPortError m_lastError;  // 上次错误类型
    QString m_lastErrorString;                  // 上次错误信息
};

#endif // SERIALMANAGER_H

